package com.sunrise.configuracoes.bean;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ComponentSystemEvent;

import lombok.Getter;

import org.springframework.stereotype.Controller;

import com.sunrise.configuracoes.servico.ManterPerfilService;
import com.sunrise.configuracoes.visao.PerfilForm;
import com.sunrise.generico.bean.ManterBean;
import com.sunrise.generico.entidade.Funcionalidade;
import com.sunrise.generico.entidade.Perfil;
import com.sunrise.generico.entidade.Permissao;
import com.sunrise.generico.util.MessagesUtil;

@ManagedBean
@ViewScoped
@Controller
public class ManterPerfilBean extends ManterBean<Perfil> {


	@Resource
	@Getter
	private ManterPerfilService perfilService;

	@Resource
	@Getter
	private PerfilForm formulario;

	@Override
	public List<Perfil> iniciarlizarListEntidade() {
		return new ArrayList<Perfil>();
	}

	@Override
	public void inicializarEntidade() {
		setEntidade(new Perfil());
		getEntidade().setAtivo(Boolean.TRUE);

	}

	@Override
	public void preRenderNew(ComponentSystemEvent event) {
		if (getEntidade() == null) {
			setEntidade(new Perfil());
		}

		getFormulario().setFuncionalidades(getPerfilService().listarFuncionalidadesOrdenado());
		inicializarPermissoesSelecionadas();
	}

	private void inicializarPermissoesSelecionadas() {
		getFormulario().setPermissoes(new ArrayList<Permissao[]>());
		for (Funcionalidade funcionalidade : getFormulario().getFuncionalidades()) {
			Permissao[] listaPermissoes = new Permissao[funcionalidade.getPermissoes().size()];
			getFormulario().getPermissoes().add(listaPermissoes);
		}

	}

	@Override
	public void preRenderEdit(ComponentSystemEvent event) {
		setEntidade(getPerfilService().carregarPerfil(getEntidade().getId()));
		getFormulario().setFuncionalidades(getPerfilService().listarFuncionalidadesOrdenado());

		List<Permissao[]> permissoes = new ArrayList<Permissao[]>();
		for (Funcionalidade funcionalidade : getFormulario().getFuncionalidades()) {
			Permissao[] permissoesFuncionalidade = new Permissao[funcionalidade.getPermissoes().size()];
			int cont = 0;
			for (Permissao permissao : funcionalidade.getPermissoes()) {
				for (Permissao permissaoPerfil : getEntidade().getPermissoes()) {
					if (permissao.getId().equals(permissaoPerfil.getId())) {
						permissoesFuncionalidade[cont++] = permissao;
					}

				}
			}
			permissoes.add(permissoesFuncionalidade);
		}
		getFormulario().setPermissoes(permissoes);
		getFormulario().setFuncionalidadesSize(getFormulario().getFuncionalidades().size());
	}

	public String alterar() {
		MessagesUtil.addNewInfoMessage(getPerfilService().salvar(getEntidade(), getFormulario().getPermissoes()));
		return getListar();
	}

	public String salvar() {
		MessagesUtil.addNewInfoMessage(getPerfilService().inserir(getEntidade(), getFormulario().getPermissoes()));
		return getListar();
	}

	public void buscarPorFiltros(){
		setEntidades(getPerfilService().buscarPorFiltros(getFiltro()));
	}
	
	public String habilitar() {
		try {
			getEntidade().setAtivo(Boolean.TRUE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroHabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoHabilitado"));
			return null;
		}
	}
	
	public String desabilitar() {
		try {
			getEntidade().setAtivo(Boolean.FALSE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroDesabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoDesabilitado"));
			return null;
		}
	}

}
